package ch02_data.encoding;

import org.junit.Test;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * 字符是指计算机中使用的字母、数字、字和符号。
 * 注意：脱落具体的编码谈某个字符占几个字节是没有意义的。
 * 一个汉字字符存储要两个字节，一个英文字符存储要一个字节。
 * ASCII是一个字节，Unicode是两个字节。
 * Java的字符集是Unicode，所以是两个字节。
 * 特别注意：Unicode是标准编码，只是一种定义，不能算是计算机的存储和通信编码！！！
 *
 * @author guodd
 * @version 1.0 use jdk 1.8
 */
public class CharUse {
    // 看系统编码 --> JVM实例编码 --> 字符串编码
    @Test
    public void charUse() {
        // 关注在系统和系统之间交互的时候，要注意语言编码；正确选择合适的编码
        // JAVA_TOOL_OPTIONS变量值：-Dfile.encoding=UTF-8
        // java -Dfile.encoding=utf-8 -jar xxx.jar
        System.out.println(Charset.defaultCharset());
        // JVM运行时所使用的编码
        System.out.println(System.getProperty("native.encoding"));
        System.out.println(System.getProperty("file.encoding"));
        String str = "0123456789";
        System.out.println(str.getBytes(StandardCharsets.UTF_8).length);
        for (int i = 0; i < str.length(); i++) {
            System.out.print(str.charAt(i));
        }
        System.out.println();
        Character a = '中';
        System.out.println(a.charValue());
    }

    @Test
    public void str() {
        // 一个汉字字符
        String a = "中";
        // System.out.println(instrumentation.getObjectSize(a));
        System.out.println(a.getBytes(StandardCharsets.UTF_8).length);
        System.out.println(a.getBytes(StandardCharsets.UTF_16).length);
        System.out.println(a.getBytes(StandardCharsets.US_ASCII).length);
    }
}
